package com.wzh.easyapi.controller;

import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzh.easyapi.base.R;
import com.wzh.easyapi.bean.SqlManage;
import com.wzh.easyapi.dto.SqlManageDTO;
import com.wzh.easyapi.form.SQLRequest;
import com.wzh.easyapi.service.DynamicSQLService;
import com.wzh.easyapi.service.SqlManageService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * SQL 管理控制器
 */
@RestController
@RequestMapping("/sqlManage")
public class SqlManageController {
    @Autowired
    private DynamicSQLService sqlService;

    @Autowired
    private SqlManageService sqlManageService;

    /**
     * 添加 SQL 管理记录
     *
     * @param sqlManage SQL 管理实体
     * @return 添加结果
     */
    @PostMapping
    public R<Boolean> addSqlManage(@RequestBody SqlManage sqlManage) {
        sqlManage.setSqlEncode(Base64.encode(sqlManage.getSqlEncode()));
        return R.ok(sqlManageService.save(sqlManage));
    }

    /**
     * 更新 SQL 管理记录
     *
     * @param sqlManage SQL 管理实体
     * @return 更新结果
     */
    @PutMapping
    public R<Boolean> updateSqlManage(@RequestBody SqlManage sqlManage) {
        sqlManage.setSqlEncode(Base64.encode(sqlManage.getSqlEncode()));
        return R.ok(sqlManageService.updateById(sqlManage));
    }

    /**
     * 删除 SQL 管理记录
     *
     * @param id 主键 ID
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public R<Boolean> deleteSqlManage(@PathVariable String id) {
        return R.ok(sqlManageService.removeById(id));
    }

    /**
     * 根据 ID 查询 SQL 管理记录
     *
     * @param id 主键 ID
     * @return 查询结果
     */
    @GetMapping("/{id}")
    public R<SqlManage> getSqlManageById(@PathVariable String id) {
        SqlManage byId = sqlManageService.getById(id);
        byId.setSqlEncode(Base64.decodeStr(byId.getSqlEncode()));
        return R.ok(byId);
    }

    /**
     * 分页查询 SQL 管理记录，包含数据源名称
     *
     * @param pageNum  页码
     * @param pageSize 每页记录数
     * @param path     请求路径（可选）
     * @return 分页查询结果
     */
    @GetMapping("/page")
    public R<Page<SqlManageDTO>> getSqlManagePage(
            @RequestParam int pageNum,
            @RequestParam int pageSize,
            @RequestParam(required = false) String path) {
        return R.ok(sqlManageService.getSqlManagePage(pageNum, pageSize, path));
    }

    /**
     * 获取所有 SQL 管理记录
     *
     * @return 所有记录
     */
    @GetMapping
    public R<List<SqlManage>> getAllSqlManages() {
        return R.ok(sqlManageService.list());
    }



    /**
     * 执行sql
     * @param sqlManage
     * @return
     */
    @PostMapping("/execute")
    public R<JSONArray> executeSQL(@RequestBody SqlManage sqlManage) {
        try {
            List<Map<String, Object>> result = sqlService.executeSQL(sqlManage);
            return R.ok(JSONUtil.parseArray(result));
        } catch (Exception e) {
            return R.fail(e.getMessage());
        }
    }
}
